package com.harveyspace.aes.core.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日志处理工具类,所有业务类必须调用该日志类进行日志输出，所有日志均使用slf4j打印
 *
 * @Author <a href="harveyer@163.com">harvey</a>
 * @date 2017/3/13
 * @since 1.0.0
 */
public class LogUtil {

    /**
     * 成功状态
     */
    public static final Integer OK = 0;

    /**
     * 系统错误
     */
    public static final Integer SYS_ERROR = -1;

    /**
     * 系统警告
     */
    public static final Integer SYS_WARN = -2;

    /**
     * 日志格式
     */
    private final String LOG_FORMAT = "%d | %s";

    private Logger log = null;

    private LogUtil(Class<?> clazz) {
        log = LoggerFactory.getLogger(clazz);
    }

    /**
     * 日志实例化
     *
     * @param clazz
     * @return
     */
    public static LogUtil newInstance(Class<?> clazz) {
        return new LogUtil(clazz);
    }

    /**
     * 打印警告日志.
     *
     * @param message
     */
    public void warn(String message) {
        log.warn(String.format(LOG_FORMAT, SYS_WARN, message));
    }

    /**
     * 打印警告日志.
     *
     * @param code
     * @param message
     */
    public void warn(Integer code, String message) {
        log.warn(String.format(LOG_FORMAT, code, message));
    }

    /**
     * 打印info日志.
     *
     * @param message
     */
    public void info(String message) {
        log.info(String.format(LOG_FORMAT, OK, message));
    }

    /**
     * 打印info日志.
     *
     * @param code
     * @param message
     */
    public void info(Integer code, String message) {
        log.info(String.format(LOG_FORMAT, code, message));
    }


    /**
     * 打印debug日志.
     *
     * @param message
     */
    public void debug(String message) {
        if (log.isDebugEnabled()) {
            log.debug(String.format(LOG_FORMAT, OK, message));
        }
    }

    /**
     * 打印debug日志.
     *
     * @param code
     * @param message
     */
    public void debug(Integer code, String message) {
        if (log.isDebugEnabled()) {
            log.debug(String.format(LOG_FORMAT, code, message));
        }
    }


    /**
     * 打印error日志.
     *
     * @param message
     */
    public void error(String message, Exception e) {
        if (log.isErrorEnabled()) {
            log.error(String.format(LOG_FORMAT, SYS_ERROR, message), e);
        }
    }

    /**
     * 打印error日志.
     *
     * @param code
     * @param message
     */
    public void error(Integer code, String message, Exception e) {
        if (log.isErrorEnabled()) {
            log.error(String.format(LOG_FORMAT, code, message), e);
        }
    }

    public boolean isTraceEnabled() {
        return log.isTraceEnabled();
    }

    public boolean isInfoEnabled() {
        return log.isInfoEnabled();
    }

    public boolean isWarnEnabled() {
        return log.isWarnEnabled();
    }

    public boolean isErrorEnabled() {
        return log.isErrorEnabled();
    }

    public boolean isDebugEnabled() {
        return log.isDebugEnabled();
    }
}
